package com.example.gobang_system.controller;

import com.example.gobang_system.common.errorcode.ControllerErrorCodeConstants;
import com.example.gobang_system.common.exception.ControllerException;
import com.example.gobang_system.common.pojo.CommonResult;
import com.example.gobang_system.common.util.JacksonUtil;
import com.example.gobang_system.controller.param.UserLoginParam;
import com.example.gobang_system.controller.param.UserRegisterParam;
import com.example.gobang_system.controller.result.UserInfoResult;
import com.example.gobang_system.controller.result.UserLoginResult;
import com.example.gobang_system.controller.result.UserRegisterResult;
import com.example.gobang_system.service.UserService;
import com.example.gobang_system.service.dto.UserInfoDTO;
import com.example.gobang_system.service.dto.UserLoginDTO;
import com.example.gobang_system.service.dto.UserRegisterResultDTO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 获取用户信息
     * @param request
     * @return
     */
    @RequestMapping("/getUserInfo")
    public CommonResult<UserInfoResult> getUserInfo(HttpServletRequest request) {
        // 日志打印
        log.info("getUserInfo 从 HttpSession 中获取用户信息");
        // 检查当前请求是否已经有会话对象,如果没有现有的会话，则返回 null
        // 而不是创建一个新的会话
        HttpSession session = request.getSession(false);
        // 业务逻辑处理
        UserInfoDTO userInfoDTO = userService.getUserInfo(session);
        // 构造响应并返回
        if (null == userInfoDTO) {
            return CommonResult.noLogin();
        }
        return CommonResult.success(convertToUserInfoResult(userInfoDTO));
    }

    /**
     * 将 UserInfoDTO 转化为 UserInfoResult
     * @param userInfoDTO
     * @return
     */
    private UserInfoResult convertToUserInfoResult(UserInfoDTO userInfoDTO) {
        // 参数校验
        if (null == userInfoDTO) {
            throw new ControllerException(ControllerErrorCodeConstants.GET_USER_INFO_ERROR);
        }
        // 构造 UserInfoResult
        UserInfoResult userInfoResult = new UserInfoResult();
        userInfoResult.setUserId(userInfoDTO.getUserId());
        userInfoResult.setUserName(userInfoDTO.getUserName());
        userInfoResult.setScore(userInfoDTO.getScore());
        userInfoResult.setTotalCount(userInfoDTO.getTotalCount());
        userInfoResult.setWinCount(userInfoDTO.getWinCount());
        // 返回
        return userInfoResult;
    }

    /**
     * 用户登录
     * @param param
     * @param session
     * @return
     */
    @RequestMapping("/login")
    public CommonResult<UserLoginResult> login(@Validated @RequestBody UserLoginParam param, HttpSession session) {
        // 日志打印
        log.info("login 接收到参数 UserLoginParam: {}",
                JacksonUtil.writeValueAsString(param));
        // 业务逻辑处理
        UserLoginDTO userLoginDTO = userService.login(param, session);
        // 构造响应并返回
        return CommonResult.success(convertToUserLoginResult(userLoginDTO));
    }

    /**
     * 将 UserLoginDTO 转化为 UserLoginResult
     * @param userLoginDTO
     * @return
     */
    private UserLoginResult convertToUserLoginResult(UserLoginDTO userLoginDTO) {
        // 参数校验
        if (null == userLoginDTO) {
            throw new ControllerException(ControllerErrorCodeConstants.LOGIN_ERROR);
        }
        // 构造 UserLoginResult
        UserLoginResult userLoginResult = new UserLoginResult();
        userLoginResult.setUserId(userLoginDTO.getUserId());
        // 返回
        return userLoginResult;
    }

    /**
     * 用户注册
     * @param param
     * @return
     */
    @RequestMapping("/register")
    public CommonResult<UserRegisterResult> register(@Validated @RequestBody UserRegisterParam param) {
        // 日志打印
        log.info("register 接收到参数 UserRegisterParam: {}",
                JacksonUtil.writeValueAsString(param));
        // 业务逻辑处理
        UserRegisterResultDTO userRegisterResultDTO = userService.register(param);
        // 构造响应并返回
        return CommonResult.success(
                convertToUserRegisterResult(userRegisterResultDTO));
    }

    /**
     * 将 UserRegisterResultDTO 转化为 UserRegisterResult
     * @param userRegisterResultDTO
     * @return
     */
    private UserRegisterResult convertToUserRegisterResult(UserRegisterResultDTO userRegisterResultDTO) {
        // 参数校验
        if (null == userRegisterResultDTO) {
            throw new ControllerException(ControllerErrorCodeConstants.REGISTER_ERROR);
        }
        // 构造 UserRegisterResult
        UserRegisterResult result = new UserRegisterResult();
        result.setUserId(userRegisterResultDTO.getUserId());
        // 返回
        return result;
    }

}
